home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / grafik / raytracing / rayshade-4.0.6.3 / libshade / options.c < prev    next >
C/C++ Source or Header  |  1994-08-09  |  10KB  |  380 lines

  1. /*
  2.  * options.c
  3.  *
  4.  * Copyright (C) 1989, 1991, Craig E. Kolb
  5.  * All rights reserved.
  6.  *
  7.  * This software may be freely copied, modified, and redistributed
  8.  * provided that this copyright notice is preserved on all copies.
  9.  *
  10.  * You may not distribute this software, in whole or in part, as part of
  11.  * any commercial product without the express consent of the authors.
  12.  *
  13.  * There is no warranty or other guarantee of fitness of this software
  14.  * for any purpose.  It is provided solely "as is".
  15.  *
  16.  * options.c,v 4.1 1994/08/09 08:04:38 explorer Exp
  17.  *
  18.  * options.c,v
  19.  * Revision 4.1  1994/08/09  08:04:38  explorer
  20.  * Bump version to 4.1
  21.  *
  22.  * Revision 1.1.1.1  1994/08/08  04:52:17  explorer
  23.  * Initial import.  This is a prerelease of 4.0.6enh3, or 4.1 possibly.
  24.  *
  25.  * Revision 4.0.1.3  92/01/14  18:29:59  cek
  26.  * patch3: Added "-u" (cpp) option.
  27.  * 
  28.  * Revision 4.0.1.2  91/12/13  12:09:53  cek
  29.  * patch3: Fixed "-W" option typo.
  30.  * 
  31.  * Revision 4.0.1.1  91/10/05  18:23:15  cek
  32.  * patch1: Changes for new window/crop options.
  33.  * patch1: Corrected help message.
  34.  * 
  35.  * Revision 4.0  91/07/17  14:46:47  kolb
  36.  * Initial version.
  37.  * 
  38.  */
  39. #include "rayshade.h"
  40. #include "options.h"
  41. #include "stats.h"
  42. #include "viewing.h"
  43.  
  44. RSOptions    Options;
  45.  
  46. static void usage();
  47.  
  48. void
  49. RSOptionsSet(argc, argv)
  50. int argc;
  51. char **argv;
  52. {
  53.     extern void OpenStatsFile();
  54.  
  55.     Options.progname = strsave(argv[0]);
  56.     Options.inputname = (char *)NULL;
  57. #ifdef AMIGA
  58.     Options.SAScpp = 0;
  59. #endif
  60.  
  61.     while (--argc) {
  62.         argv++;
  63.         if (argv[0][0] != '-') {
  64.             /*
  65.              * Must be the input file name.
  66.              * If already given, complain and then exit.
  67.              */
  68.             if (Options.inputname != (char *)NULL) {
  69.                 usage();    
  70.                 exit(1);
  71.             }
  72.             Options.inputname = strsave(argv[0]);
  73.             continue;
  74.         }
  75.         /* else */
  76.         switch(argv[0][1]) {
  77.             case 'A':
  78.                 /*
  79.                  * First frame number
  80.                  */
  81.                 Options.startframe = atoi(argv[1]);
  82.                 argv++; argc--;
  83.                 break;
  84. #ifdef URT
  85.             case 'a':
  86.                 Options.alpha = !Options.alpha;
  87.                 break;
  88. #endif
  89.             case 'C':
  90.                 Options.cutoff.r = atof(argv[1]);
  91.                 Options.cutoff.g = atof(argv[2]);
  92.                 Options.cutoff.b = atof(argv[3]);
  93.                 Options.cutoff_set = TRUE;
  94.                 argv += 3; argc -= 3;
  95.                 break;
  96. #ifdef URT
  97.             case 'c':
  98.                 Options.appending = TRUE;
  99.                 break;
  100. #endif
  101.             case 'D':
  102.                 Options.maxdepth = atoi(argv[1]);
  103.                 Options.maxdepth_set = TRUE;
  104.                 argv++; argc--;
  105.                 break;
  106.             case 'E':
  107.                 Options.eyesep = atof(argv[1]);
  108.                 Options.eyesep_set = TRUE;
  109.                 argc--; argv++;
  110.                 break;
  111. #ifdef URT
  112.             case 'e':
  113.                 Options.exp_output = TRUE;
  114.                 break;
  115. #endif
  116.             case 'F':
  117.                 Options.report_freq = atoi(argv[1]);
  118.                 if (Options.report_freq < 1)
  119.                     Options.report_freq = 1;
  120.                 Options.freq_set = TRUE;
  121.                 argv++; argc--;
  122.                 break;
  123.             case 'f':
  124.                 Options.flipnorm = !Options.flipnorm;
  125.                 break;
  126.             case 'G':
  127.                 Options.gamma = atof(argv[1]);
  128.                 argv++; argc--;
  129.                 break;
  130.             case 'g':
  131.                 Options.gaussian = !Options.gaussian;
  132.                 break;
  133.             case 'h':
  134.                 usage();
  135.                 exit(0);
  136.                 break;
  137.             case 'j':
  138.                 Options.jitter = !Options.jitter;
  139.                 Options.jitter_set = TRUE;
  140.                 break;
  141. #ifdef AMIGA
  142.             case 'L':
  143.                 Options.SAScpp = 1;
  144.                 break;
  145. #endif
  146.             case 'l':
  147.                 Options.stereo = LEFT;
  148.                 break;
  149. #ifdef URT
  150.             case 'm':
  151.                 Options.samplemap = !Options.samplemap;
  152.                 break;
  153. #endif
  154.             case 'N':
  155. #ifdef AMIGA    /* Should be unconditional--this is a bug! */
  156.                 Options.totalframes = atoi(argv[1]);
  157. #else
  158.                 Options.totalframes = atof(argv[1]);
  159. #endif
  160.                 Options.totalframes_set = TRUE;
  161.                 argv++; argc--;
  162.                 break;
  163.             case 'n':
  164.                 Options.no_shadows = !Options.no_shadows;
  165.                 break;
  166.             case 'O':
  167.                 Options.imgname = strsave(argv[1]);
  168.                 argv++;
  169.                 argc--;
  170.                 break;
  171.             case 'o':
  172.                 Options.shadowtransp = !Options.shadowtransp;
  173.                 break;
  174.             case 'P':
  175.                 Options.cppargs = argv[1];
  176.                 argv++; argc--;
  177.                 break;
  178.             case 'p':
  179.                 /*
  180.                  * Preview-quality rendering
  181.                  * no shadows
  182.                  * max depth of 0
  183.                  * 1 jittered sample/pixel
  184.                  */
  185.                 Options.no_shadows = TRUE;
  186.                 Options.maxdepth = 0;
  187.                 Options.maxdepth_set = TRUE;
  188.                 Options.jitter = TRUE;
  189.                 Options.jitter_set = TRUE;
  190.                 Options.samples = 1;
  191.                 Options.samples_set = TRUE;
  192.                 break;
  193.             case 'q':
  194.                 Options.quiet = TRUE;
  195.                 break;
  196.             case 'R':
  197.                 Screen.xres = atoi(argv[1]);
  198.                 Screen.yres = atoi(argv[2]);
  199.                 Options.resolution_set = TRUE;
  200.                 argv += 2;
  201.                 argc -= 2;
  202.                 break;
  203.             case 'r':
  204.                 Options.stereo = RIGHT;
  205.                 break;
  206.             case 'S':
  207.                 Options.samples = atoi(argv[1]);
  208.                 if (Options.samples < 1)
  209.                     Options.samples = 1;
  210.                 Options.samples_set = TRUE;
  211.                 argv++; argc--;
  212.                 break;
  213.             case 's':
  214.                 Options.cache = !Options.cache;
  215.                 break;
  216.             case 'T':
  217.                 Options.contrast.r = atof(argv[1]);
  218.                 Options.contrast.g = atof(argv[2]);
  219.                 Options.contrast.b = atof(argv[3]);
  220.                 Options.contrast_set = TRUE;
  221.                 argv += 3;
  222.                 argc -= 3;
  223.                 break;
  224.             case 'u':
  225.                 Options.cpp = !Options.cpp;
  226.                 break;
  227.             case 'v':
  228.                 Options.verbose = TRUE;
  229.                 break;
  230.             case 'V':
  231.                 Options.verbose = TRUE;
  232.                 if (argv[1][0] == '-') {
  233.                     /* User probably blew it, and
  234.                      * it's difficult to remove a file
  235.                      * that begins with '-'...
  236.                      */
  237.                     usage();
  238.                     exit(2);
  239.                 }
  240.                 Options.statsname = strsave(argv[1]);
  241.                 OpenStatsFile();
  242.                 argv++; argc--;
  243.                 break;
  244.             case 'W':
  245.                 Options.window[LOW][X] = atoi(argv[1]);
  246.                 Options.window[HIGH][X] = atoi(argv[2]);
  247.                 Options.window[LOW][Y] = atoi(argv[3]);
  248.                 Options.window[HIGH][Y] = atoi(argv[4]);
  249.                 Options.window_set = TRUE;
  250.                 argv += 4; argc -= 4;
  251.                 break;
  252.             case 'X':
  253.                 Options.crop[LOW][X] = atof(argv[1]);
  254.                 Options.crop[HIGH][X] = atof(argv[2]);
  255.                 Options.crop[LOW][Y] = atof(argv[3]);
  256.                 Options.crop[HIGH][Y] = atof(argv[4]);
  257.                 Options.crop_set = TRUE;
  258.                 argv += 4; argc -= 4;
  259.                 break;
  260.                         case 'z':
  261.                 Options.zbufprint = TRUE;
  262.                 if (argv[1][0] == '-') {
  263.                     /* User probably blew it, and
  264.                      * it's difficult to remove a file
  265.                      * that begins with '-'...
  266.                      */
  267.                     usage();
  268.                     exit(2);
  269.                 }
  270.                 if (argv[0][2])
  271.                     Options.zbufname = strsave (argv[0]+2);
  272.                 else if (argv[1]) {
  273.                     Options.zbufname = strsave(argv[1]);
  274.                     argv++; argc--;
  275.                 } else {
  276.                     usage();
  277.                     exit(2);
  278.                 }
  279.                 break;
  280.             default:
  281.                 RLerror(RL_PANIC,"Bad argument: %s\n",argv[0]);
  282.         }
  283.     }
  284. }
  285.  
  286. void
  287. RSOptionsList()
  288. {
  289.     if (Options.totalframes > 1) {
  290.         fprintf(Stats.fstats,"Rendering frames %d through %d.\n",
  291.             Options.startframe, Options.endframe);
  292.     } else {
  293.         fprintf(Stats.fstats,"Rendering frame %d.\n", Options.startframe);
  294.     }
  295.  
  296.     fprintf(Stats.fstats,"Screen resolution: %d x %d\n",
  297.         Screen.xres,Screen.yres);
  298.     fprintf(Stats.fstats,"Image window: (%d - %d), (%d - %d).\n",
  299.             Screen.minx, Screen.maxx, Screen.miny, Screen.maxy);
  300.  
  301.     if (Options.jitter)
  302.         fprintf(Stats.fstats,"Using jittered sampling, ");
  303.     fprintf(Stats.fstats,"Max sampling rate %d %s/pixel.\n",
  304.         Options.samples*Options.samples,
  305.         Options.samples == 1 ? "sample" : "samples");
  306.  
  307.     fprintf(Stats.fstats,
  308.         "Maximum contrast: %g red, %g green, %g blue.\n",
  309.         Options.contrast.r, Options.contrast.g,
  310.         Options.contrast.b);
  311.     fprintf(Stats.fstats,"Maximum ray depth: %d.  Cutoff thresh: %g %g %g.\n",
  312.             Options.maxdepth,
  313.             Options.cutoff.r, Options.cutoff.g, Options.cutoff.b);
  314.     if (Options.stereo == LEFT)
  315.         fprintf(Stats.fstats,"Rendering image for left eye.\n");
  316.     else if (Options.stereo == RIGHT)
  317.         fprintf(Stats.fstats,"Rendering image for right eye.\n");
  318.     if (Options.no_shadows) {
  319.         fprintf(Stats.fstats,"No shadows are rendered.\n");
  320.     } else if (Options.shadowtransp) {
  321.         fprintf(Stats.fstats,
  322.             "Object opacity affects depth of shadowing.\n");
  323.     }
  324.     if (!Options.cache)
  325.         fprintf(Stats.fstats,"Shadow caching is disabled.\n");
  326.     if (Options.totalframes != 1)
  327.         fprintf(Stats.fstats,"Rendering %d frames.\n",
  328.             Options.totalframes);
  329. }
  330.  
  331. static void
  332. usage()
  333. {
  334.     fprintf(stderr,"usage: %s [options] [filename]\n", Options.progname);
  335.     fprintf(stderr,"Where options include:\n");
  336.     fprintf(stderr,"\t-A frame\t(Begin with given frame #.)\n");
  337. #ifdef URT
  338.     fprintf(stderr,"\t-a \t\t(Toggle writing of alpha channel.)\n");
  339. #endif
  340.     fprintf(stderr,"\t-C thresh\t(Set adaptive ray tree cutoff value.)\n");
  341. #ifdef URT
  342.     fprintf(stderr,"\t-c \t\t(Continue interrupted rendering.)\n");
  343. #endif
  344.     fprintf(stderr,"\t-D depth\t(Set maximum ray tree depth.)\n");
  345.     fprintf(stderr,"\t-E eye_sep\t(Set eye separation in stereo pairs.)\n");
  346. #ifdef URT
  347.     fprintf(stderr,"\t-e \t\t(Write exponential RLE file.)\n");
  348. #endif
  349.     fprintf(stderr,"\t-F freq\t\t(Set frequency of status report.)\n");
  350.     fprintf(stderr,"\t-f \t\t(Flip all triangle normals.)\n");
  351.     fprintf(stderr,"\t-G gamma\t(Use given gamma correction exponent.)\n");
  352.     fprintf(stderr,"\t-g \t\t(Use Gaussian pixel filter.)\n");
  353.     fprintf(stderr,"\t-h \t\t(Print this message.)\n");
  354.     fprintf(stderr,"\t-j \t\t(Toggle jittered sampling.)\n");
  355. #ifdef AMIGA
  356.     fprintf(stderr,"\t-L \t\t(Use the SAS instead of the GNU C preprocessor.)\n");
  357. #endif
  358.     fprintf(stderr,"\t-l \t\t(Render image for left eye view.)\n");
  359. #ifdef URT
  360.     fprintf(stderr,"\t-m \t\t(Output sample map in alpha channel.)\n");
  361. #endif
  362.     fprintf(stderr,"\t-N number\t(Render given number of frames.)\n");
  363.     fprintf(stderr,"\t-n \t\t(Do not render shadows.)\n");
  364.     fprintf(stderr,"\t-O outfile \t(Set output file name.)\n");
  365.     fprintf(stderr,"\t-o \t\t(Toggle opacity effect on shadowing.)\n");
  366.     fprintf(stderr,"\t-P cpp-args\t(Options to pass to C pre-processor.\n");
  367.     fprintf(stderr,"\t-p \t\t(Preview-quality rendering.)\n");
  368.     fprintf(stderr,"\t-q \t\t(Run quietly.)\n");
  369.     fprintf(stderr,"\t-R xres yres\t(Render at given resolution.)\n");
  370.     fprintf(stderr,"\t-r \t\t(Render image for right eye view.)\n");
  371.     fprintf(stderr,"\t-S samples\t(Max density of samples^2 samples.)\n");
  372.     fprintf(stderr,"\t-s \t\t(Don't cache shadowing information.)\n");
  373.     fprintf(stderr,"\t-T r g b\t(Set contrast threshold (0. - 1.).)\n");
  374.     fprintf(stderr,"\t-V filename \t(Write verbose output to filename.)\n");
  375.     fprintf(stderr,"\t-v \t\t(Verbose output.)\n");
  376.     fprintf(stderr,"\t-W x x y y \t(Render subwindow.)\n");
  377.     fprintf(stderr,"\t-X l r b t \t(Crop window.)\n");
  378.         fprintf(stderr,"\t-z filename\t(Write Z buffer to filename.)\n");
  379. }
  380.